package 面试经典150题.矩阵;

/**
 * @author tmh
 * @date 2024/6/25 22:42
 * @description 记得后面还要重新敲一下这个代码，生命游戏的这个思路很妙
 */
public class T289生命游戏 {
    public void gameOfLife(int[][] board) {
        int m = board.length;       // 行数
        int n = board[0].length;    // 列数
        int count = 0;              // 统计每个格子周围八个位置的活细胞数
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                count = 0;      // 每个格子计数重置为0
                for (int x = -1; x <= 1; x++) {
                    for (int y = -1; y <= 1; y++) {
                        // 枚举周围八个位置，其中去掉本身（x = y = 0）和越界的情况
                        if ((x == 0 && y == 0) || i + x < 0 || i + x >= m || j + y < 0 || j + y >= n) {
                            continue;
                        }
                        // 如果周围格子是活细胞（1）或者是活细胞变死细胞（2）的，都算一个活细胞
                        if (board[i + x][j + y] == 1 || board[i + x][j + y] == 2){
                            count++;
                        }
                    }
                }
                if (board[i][j] == 1 && (count < 2 || count > 3)){
                    board[i][j] = 2;    // 格子本身是活细胞，周围满足变成死细胞的条件，标记为2
                }
                if (board[i][j] == 0 && count == 3){
                    board[i][j] = 3;      // 格子本身是死细胞，周围满足复活条件，标记为3
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                // 死细胞为0，活细胞变成死细胞为2，都为偶数，模2为0，刚好是死细胞
                // 活细胞为1，死细胞变成活细胞为3，都为奇数，模2为1，刚好是活细胞
                board[i][j] %= 2;
            }
        }

    }

/*        作者：画图小匠
        链接：https://leetcode.cn/problems/game-of-life/solutions/2353592/javapython3cmo-ni-te-shu-zhi-biao-ji-by-9b72c/
        来源：力扣（LeetCode）
        著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。*/
}
